package com.telrob.bytevm.instruct;

import java.util.List;

import com.telrob.bytevm.compile.Instruct;
import com.telrob.bytevm.compile.ReplaceCode;
import com.telrob.bytevm.utils.Define;
import com.telrob.bytevm.utils.ToolUtils;
import com.telrob.bytevm.vm.Register;

/***
 * 出栈
 * @author zrz
 *
 */
public class POP implements Instruct{
	public boolean isPseudo(String opt) {
		return false;
	}
	@Override
	public boolean isComplie(String opt) {
		if("pop".equals(opt.toLowerCase())) {
			return true;
		}
		return false;
	}

	public byte[] complie(String line,String[] param,int curretIndex,List<ReplaceCode>labelReplace) {
		byte[]data=new byte[2];
		data[0]=Define.POP;
		String o2=param[1].toLowerCase();
		if("ax".equals(o2)) {
			data[1]=Define.AX;
		}else if("bx".equals(o2)) {
			data[1]=Define.BX;
		}else if("cx".equals(o2)) {
			data[1]=Define.CX;
		}else if("dx".equals(o2)) {
			data[1]=Define.DX;
		}else if("ex".equals(o2)) {
			data[1]=Define.EX;
		}else if("ss".equals(o2)) {
			data[1]=Define.SS;
		}else if("si".equals(o2)) {
			data[1]=Define.SI;
		}else if("sp".equals(o2)) {
			data[1]=Define.SP;
		}else if("bp".equals(o2)) {
			data[1]=Define.BP;
		}else if("di".equals(o2)) {
			data[1]=Define.DI;
		}
		
		return data;
	}
	
	public int isRun(byte opt) {
		if(opt==Define.POP) {
			return 2;
		}
		return -1;
	}
	public void parseRun(Register R,byte opt,byte[]data) {
		//查找栈顶指针指向的内存中的数据
		int rx=data[R.PC+1];
		int dd=ToolUtils.getInt(data, R.SS+R.SP-4);
		if(rx==Define.AX) {
			R.AX=dd;
		}else if(rx==Define.BX) {
			R.BX=dd;
		}else if(rx==Define.CX) {
			R.CX=dd;
		}else if(rx==Define.DX) {
			R.DX=dd;
		}else if(rx==Define.EX) {
			R.EX=dd;
		}else if(rx==Define.BP) {
			R.BP=dd;
		}else if(rx==Define.SS) {
			R.SS=dd;
		}else if(rx==Define.SP) {
			R.SP=dd;
		}
		//出栈栈顶指针减4
		R.SP-=4;
		//并且程序计数器
		R.PC+=isRun(opt);
	}

}
